#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INT_TO_CHAR 48

enum NUMERADOR  //e numerador com as definição de base numerica de cada opção
{
    binario = 2,
    octal = 8,
    hexadecimal = 16
}base; //base é uma enum do tipo "NUMERADOR"

int baseConversao(int baseConvert);  		//função do menu de escolha da base
void inverterString(int tam, char* pszString); //DECLARAÇÃO DA FUNÇÃO inverterString
void converter(int nDecimal, int nValueIn, char* pszValueOut);  //declaração da função converter

int main()
{
	//declaração das variáveis
	int v, nDecimal;
	char* pszValorConvertido = NULL;
	pszValorConvertido = (char*)malloc(sizeof(char));  //relembrando, malloc define que o ponteiro pszValorConvertido vai apontar para o espaço de memória de um char

	INICIO :
	system("cls");	
	printf("-= Conversao de valores Decimais =-\n\n");  //cabeçalho
	printf("Digite um valor: ");	//Digite o valor que deseja converter
	scanf("%d", &nDecimal);			//armazena o valor na variavel nDecimal
	
	system("cls");					//limpa a tela
	printf("-= Conversao de valores Decimais =-\n\n");  //cabeçalho ;D
	
	baseConversao(nDecimal);	
	converter(nDecimal, base, pszValorConvertido);	//chama a função para converter o valor digitado pelo usuario
	
	system("cls");
	printf("-= Conversao de valores Decimais =-\n\n");  //cabeçalho ;D	
	printf("Valor convertido: %s", pszValorConvertido);  //imprime o valor que o usuario digitou convertido na base desejada
	system("PAUSE>>null");
	system("cls");
	printf("-= Conversao de valores Decimais =-\n\n");  //cabeçalho ;D
	printf("Converter outro numero?\n\n1 - sim\n2 - nao\n\n");
	scanf("%d", &v);
	if (v == 1){goto INICIO; v = 0;}
	
	free(pszValorConvertido);			//libera o ponteiro
	return 0;							//se chega aqui rolou tudo certo :D
}


void converter(int nValueIn, int nBaseNumerica, char* pszValueOut)	//função para converter valor que usuario deseja, vai usar o valor digitado, a base de conversão e uma variavel de retorno
{
    int i;															//contador
    char* pszAux = (char*)malloc(sizeof(char));						//ponteiro para auxiliar na conversão
    for(i = 0; nValueIn != 0; i++)									//enquando o valor na variavel não for zero(0) fazer abaixo
    {																	
        pszAux[i] = (nValueIn%nBaseNumerica)+INT_TO_CHAR;			//posição 0 da string recebe o resto da divisão do numero / base numerica   (a soma de 48 [INT_TO_CHAR] é para fazer com que conversa para char o valor inteiro, posição de memória)
        nValueIn /= nBaseNumerica;									//variavel recebe o quociente da divisão e faz a verificação do for em seguida
    }
    inverterString(strlen(pszAux), pszAux);							//chama a função inverterString para colocar o valor convertido na ordem certa, pois a função acima salva a conversão de tras para frente
    strcpy(pszValueOut, pszAux);									//função para copiar o valor convertido e de orden certa para a variavel de retorno
}

void inverterString(int tam, char* pszString)						//função para inverter a variavel convertida
{
	int nAux, i, j;												//variaveis de auxilio
	for (i = 0, j = tam - 1; i < j; i++, j--)						//laço para inverter valor convertido
    {
		nAux = pszString[i];										//auxiliar recebe o valor na posição 0
        pszString[i] = pszString[j];								//posição 0 recebe o valor da ultima posição
        pszString[j] = nAux;										//ultima posição recebe o valor do Auxiliar, que era o primeiro valor valor
     }
}

int baseConversao(int baseConvert){
	
	printf("Escola a base Para Conversao:\n\n1 - binario\n2 - octal\n3 - hexadecimal\n"); //menu das opções de conversão
	scanf("%d", &baseConvert);		// armazena a opção de conversão na variavel 
	if (baseConvert == 1){			//se opção == 1 - Binario
		base = binario;			//Base recebe o valor de 2
	}	
	if (baseConvert == 2){			//se opção == 2 - Octal
		base = octal;			//base recebe o valor de 8
	}	
	if (baseConvert == 3){			//se opção == 3 - hexadecimal
		base = hexadecimal;		//base recebe valor de 16
	}
	
	return baseConvert;
}
